package com.xzh.rxjava;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

import org.w3c.dom.Text;

import java.util.concurrent.Callable;

import io.reactivex.Observable;
import io.reactivex.ObservableEmitter;
import io.reactivex.ObservableOnSubscribe;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;

public class MainActivity extends AppCompatActivity {

    private TextView showText;
    private StringBuffer text = new StringBuffer();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        showText = findViewById(R.id.showText);

    }

    /**
     * 2、创建观察者
     */
    final Observer<String> observer = new Observer<String>() {
        @Override
        public void onSubscribe(Disposable d) {
            /** 当绑定的时候会被调用一次 **/
            Log.e("onSubscribe","onSubscribe");
        }

        @Override
        public void onNext(String string) {
            /** 被观察者中调用多少次onNext（）这里就会执行多少次，就类似例子里面的onChange（） **/
            Log.e("onNext","onNext : "+string);
            text.append(string+"\n");

            showText.setText(text);
        }

        @Override
        public void onError(Throwable e) {
            /** 当被观察者中调用onError（）的时候被调用 **/
            Log.e("onError","onError : "+e.getMessage());
        }

        @Override
        public void onComplete() {
            /** 当被观察者中调用onComplete（）方法的时候被调用 **/
            Log.e("onComplete","onComplete");
        }
    };

    /**
     * 1、创建一个被观察者 ( 方式 1 )
     */
    Observable<String> observable = Observable.create(new ObservableOnSubscribe() {
        @Override
        public void subscribe(ObservableEmitter emitter) throws Exception {
            observer.onNext("星期一");
            observer.onNext("星期二");
            observer.onComplete();
        }
    });

    public void onButtonClick(View view) {
        /** 事件绑定观察者 **/
        Observable observable = getObservable();         // 返回一个事件
        observable.subscribe(observer);                  //把事件和观察者绑定起来
    }

    private Observable getObservable(){

        /** 方式二 可以传递多个参数（以数组的方式） **/
//        return Observable.fromArray("星期一","星期二","星期三","星期四","星期五");

        /** 方式三 只可以传递一个参数**/
//        return Observable.fromCallable(new Callable() {
//            @Override
//            public Object call() throws Exception {
//                return "星期8";
//            }
//        });
        /** 方式四 ： 可以传递多个参数，也是以数组的形式实现的 **/
        return Observable.just("星期一","星期二","星期三");
        /** 还有其他的方式，可以多试试。 **/
    }
}
